package org.ciallo.easytokencore.context.model;

import javax.servlet.http.HttpServletResponse;

/**
 * Easy-Token 响应包装类
 *
 * <p>核心功能：</p>
 * <ul>
 *   <li>封装HTTP响应的常用操作</li>
 *   <li>提供便捷的Cookie操作方法</li>
 *   <li>简化响应头和状态码设置</li>
 *   <li>支持重定向操作</li>
 * </ul>
 *
 * <p>主要方法：</p>
 * <ul>
 *   <li>addCookie(): 添加/删除Cookie</li>
 *   <li>setHeader(): 设置响应头</li>
 *   <li>setStatus(): 设置状态码</li>
 *   <li>redirect(): 执行重定向</li>
 * </ul>
 *
 * <p>使用示例：</p>
 * <pre>
 * {@code
 * // 设置响应Cookie
 * EasyContextHolder.getResponse().addCookie(
 *     new EasyCookie("token", "abc123")
 *         .setMaxAge(3600)
 *         .setPath("/")
 * );
 *
 * // 设置响应头
 * EasyContextHolder.getResponse().setHeader("Content-Type", "application/json");
 * }
 * </pre>
 *
 * @Description: Easy-Token 响应包装类
 * @Author: Jukomu
 * @Package: org.ciallo.easytokencore.context.model
 * @Project: easy-token-demo
 * @Version: 1.0.0
 * @name: EasyResponse
 * @Date: 2025-05-06
 * @Filename: EasyResponse
 * @see EasyCookie
 * @see HttpServletResponse
 */
public class EasyResponse {
    private final HttpServletResponse response;

    public EasyResponse(HttpServletResponse response) {
        this.response = response;
    }

    /**
     * 删除指定Cookie
     *
     * @param name Cookie名称
     */
    public void deleteCookie(String name) {
        addCookie(name, null, null, null, 0);
    }

    /**
     * 删除指定Cookie
     *
     * @param name   Cookie名称
     * @param path   Cookie 路径
     * @param domain Cookie 作用域
     */
    public void deleteCookie(String name, String path, String domain) {
        addCookie(name, null, path, domain, 0);
    }

    /**
     * 写入指定Cookie
     *
     * @param name    Cookie名称
     * @param value   Cookie值
     * @param path    Cookie路径
     * @param domain  Cookie的作用域
     * @param timeout 过期时间 （秒）
     */
    public void addCookie(String name, String value, String path, String domain, int timeout) {
        this.addCookie(new EasyCookie(name, value).setPath(path).setDomain(domain).setMaxAge(timeout));
    }

    /**
     * 写入指定Cookie
     *
     * @param cookie Cookie-Model
     */
    public void addCookie(EasyCookie cookie) {
        this.addHeader(EasyCookie.HEADER_NAME, cookie.toHeaderValue());
    }

    /**
     * 设置响应状态码
     *
     * @param sc 响应状态码
     * @return 对象自身
     */
    public EasyResponse setStatus(int sc) {
        this.response.setStatus(sc);
        return this;
    }

    /**
     * 在响应头里写入一个值
     *
     * @param name  名字
     * @param value 值
     * @return 对象自身
     */
    public EasyResponse setHeader(String name, String value) {
        this.response.setHeader(name, value);
        return this;
    }

    /**
     * 在响应头里添加一个值
     *
     * @param name  名字
     * @param value 值
     * @return 对象自身
     */
    public EasyResponse addHeader(String name, String value) {
        this.response.addHeader(name, value);
        return this;
    }

    /**
     * 在响应头写入 [Server] 服务器名称
     *
     * @param value 服务器名称
     * @return 对象自身
     */
    public EasyResponse setServer(String value) {
        return this.setHeader("Server", value);
    }

    /**
     * 重定向
     *
     * @param url 重定向地址
     * @return 任意值
     */
    public Object redirect(String url) {
        this.response.encodeRedirectURL(url);
        return this;
    }
}
